package com.ipworkbench.common.db;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.ipworkbench.common.util.IPWException;

/**
 * DAO基类支撑类
 * 
 * @author zhangfaheng
 *
 * @date May 15, 2010
 */
public class BaseDaoSupport{
	
	/**
	   * 连接池连接对象
	   */	
	  protected Connection cn = null;
	  protected PreparedStatement ps = null;
	  protected Statement st = null;
	  protected ResultSet rs = null;
	  protected CallableStatement cs = null;
	
	/**
	 *获取当前线程里的数据库连接（添加、修改、删除操作使用）
	 *									需要使用事务的连接，在业务层处理事务
	 * 
	 * @return Connection
	 */
	public Connection getTranConn(){
	     return  ConnectionFactory.getConnection();
	}
	
	/**
	 * 获取连接池原始连接(查询使用)
	 * 				不涉及到事务的，使用完在DAO层关闭
	 * 
	 * @return Connection
	 * 
	 * @throws IPWException
	 */
	public Connection getConn() throws IPWException{
		Connection conn = null;
		try {
			conn = ConnectionFactory.getInstace().takeConnection();
		} catch (IPWException e) {
			throw e;		
		}
		return conn;
	}
	
	
	/**
	 * 关闭数据库原始连接
	 * 
	 * @return Connection
	 * 
	 * @throws IPWException
	 */
	public void closeConn(Connection conn) throws IPWException{
		
		try {
			if(null != conn){
				conn.close();
			}
		} catch (SQLException e) {
			throw new IPWException(e);
		}
		
	}
	
	/**
	   *  从连接池里抓取数据库连接
	   *  
	   * @param isJdbcCn 是否使用事务连接（从线程取） true:是；false：否（连接池里取）
	   * 
	   * @throws IPWException
	   */
	  protected void takeConn(boolean isJdbcCn) throws IPWException{
		  try {
			  if(isJdbcCn && cn == null){ // 处理事务，从线程里取链接
				  this.cn = this.getTranConn();
			  }else if(cn == null){ // 不处理事务，从连接池取
				  this.cn = this.getConn();
			  }
			  
			  if (cn==null)
				  this.cn = this.getConn();
			   
		} catch (Exception e) {
			throw new IPWException(e.getMessage());
		}
	  }
	  
	  /**
	   * 关闭JDBC资源
	   * 
	   * @throws IPWException
	   */
	  protected void closeDB() throws IPWException{
		try {
				if(rs != null){
					rs.close();
					rs = null;
				}
				if(st != null){
					st.close();
					st = null;
				}	
				if(ps != null){
					ps.close();
					ps = null;
				}	
				if(cs != null){
					cs.close();
					cs = null;
				}	
				if(cn != null){
					cn.close();
					cn = null;
				}
			} catch (Exception e) {
				throw new IPWException(e.getMessage());
			}
	  }
}
